<?php
/**
 * Sql конструктор который содержит данные для 
 * запросов к базе данных.
 * методы is отвечают на вопрос есть ли определеная информация в базе или нет.
 * методы insert|delete|update изменяют данные в базе данных не посредствено
 * методы get возвращают обьект Zend_Db_Select
 * @author nrnwest@gmail.com
 *
 */
class User_Model_Sql_Pdo_Mysql extends Arm_Db_Sql_Mysql
{
    /**
     * Таблица с временными данными для регистрации пользователя в системе.
     * 
     * @var string
     */
    const USER_TEMP_REGISTER = 'user_temp_register';
    /**
     * таблица с данными пользователя
     * @var string
     */
    const USER_USER = 'user_user';
    /**
     * Таблица с кодом для измения паспорта
     * @var string
     */
    const USER_CHADE_PASSWORD = 'user_chade_password';
    /**
     * Таблица с группами пользвоателей.
     * @var string $_user_group
     */
    const USER_GROUP = 'user_group';
    /**
     * Существует ли логин в системе или нет.
     * 
     * @param string $login
     * @return bool
     */
    public function isLogin ($login)
    {
        $select = $this->_db->select();
        $select->from(self::USER_USER);
        $select->where('login =?', $login);
        if ($this->_db->fetchOne($select) === false) {
            return false;
        }
        return true;
    }
    /**
     * Существует ли емаил в таблице user или нет.
     * @param string $email
     */
    public function isEmail ($email)
    {
        $select = $this->_db->select();
        $select->from(self::USER_USER);
        $select->where('email =?', $email);
        if ($this->_db->fetchOne($select) === false) {
            return false;
        }
        return true;
    }
    /**
     * Проверяем зарегистрирован ли ключ в таблице user
     * @param string $key
     */
    public function isKeyUser ($key)
    {
        $select = $this->_db->select();
        $select->from(self::USER_USER);
        $select->where('`key` =?', $key);
        if ($this->_db->fetchOne($select) === false) {
            return false;
        }
        return true;
    }
    /**
     * Проверка есть ли ключ в временой таблице
     * @param unknown_type $key
     */
    public function isKeyTempTable ($key)
    {
        $select = $this->_db->select();
        $select->from(self::USER_TEMP_REGISTER);
        $select->where('`key` =?', $key);
        if ($this->_db->fetchOne($select) === false) {
            return false;
        }
        return true;
    }
    /**
     * Получения данных пользователя с временой таблицы
     * @param string $key
     * @return Zend_Db_Select
     */
    public function getUserTempRegister ($key)
    {
        $select = $this->_db->select();
        $select->from(self::USER_TEMP_REGISTER);
        $select->where('`key` = ?', $key);
        return $select;
    }
    /**
     * Удаления данных с временой таблицы регистрации пользователей.
     * @param string $key ключ регистрации.
     */
    public function deleteUserTemp ($key)
    {
        $this->_db->delete(
        self::USER_TEMP_REGISTER, 
        $this->_db->quoteInto('`key` = ?', $key));
        return;
    }
    /**
     * запишет информацию про нового пользователя в таблицу.
     * @param array $data
     * @return int id нового пользователя
     */
    public function insertUserData ($data)
    {
        $data = $this->_getArrayColumTable(self::USER_USER, $data);
        $this->_db->insert(self::USER_USER, $data);
        return $this->_db->lastInsertId(self::USER_USER);
    }
    
    /**
     * Создания нового пользователя
     * @param unknown_type $data
     * @param unknown_type $group
     */
    public function createUserData($data, $group)
    {
       $data['id_group'] = $this->getIdGroup($group);
       return $this->insertUserData($data);
    }
    
    /**
     * Вернет id группы
     * @param названия группы $name
     */
    public function getIdGroup($name)
    {
       $select = $this->_getSelect();
       $select->from(self::USER_GROUP, 'id');
       $select->where('name=?', $name);
       return  $this->getDb()->fetchOne($select);
    }
    
    /**
     * Запись данных веденных пользвоателем в временую талицу.
     * @param array $data
     */
    public function insertUserRegister ($data)
    {
        $this->_db->insert(
        self::USER_TEMP_REGISTER, $data);
        return;
    }
    /**
     * Ищет пользователя по логину или емаилу, если находит 
     * возвращает масив данных или false
     * @param  string $loginOrEmail
     * @return Zend_Db_Select
     */
    public function getUserLogiOrEmail ($loginOrEmail)
    {
        $select = $this->_db->select();
        $select->from(self::USER_USER);
        $select->where('login = ?', $loginOrEmail);
        $select->orWhere('email = ?', $loginOrEmail);
        return $select;
    }
    /**
     * Проверка клююча для имзения паспорта
     * @param string $key
     * @return bool
     */
    public function isKeyRemidPassword ($key)
    {
        // удалим старые записи
        $this->delStaleDataChadePassword();
        $select = $this->_db->select();
        $select->from(
        self::USER_CHADE_PASSWORD);
        $select->where('`key` = ?', $key);
        if (false === $this->_db->fetchOne(
        $select)) {
            return false;
        }
        return true;
    }
    /**
     * Вернет данные пользователя по его логину и паролю
     * @param string $login
     * @param string $password
     * @return Zend_Db_Select
     */
    public function getDataUser ($login, $password)
    {
        $select = $this->_getSelect();
        $select->from(self::USER_USER);
        $select->where('login = ?', $login);
        $select->where('password = ?', $password);
        $select->join(self::USER_GROUP, 
        self::USER_USER . '.id_group=' . self::USER_GROUP . '.id', 
        array('group' => 'name', 'group_title' => 'title'));
        return $select;
    }
    
    /**
     * получения всех пользователей
     * 
     * @param bool $returnSelect
     */
    public function getUsers($returnSelect = false)
    {
        $select = $this->_getSelect();
        $select->from(self::USER_USER);
        $select->join(self::USER_GROUP, self::USER_USER . '.id_group = ' . self::USER_GROUP . '.id',
                      array('group_name'=>'name', 'group_title'=>'title')
                      );
        if($returnSelect) {
            return $select;
        }
        return $this->_db->fetchAll($select);
    }
    
    /**
     * Вернет системный ключ пользователя.
     * @param $login
     * @return string|false
     */
    public function getUserKey($login)
    {
        $select = $this->_getSelect();
        $select->from(self::USER_USER, 'key');
        $select->where('login = ?', $login);
        return $this->getDb()->fetchOne($select);
    }
    
    /**
     * Обновления пользователя.
     *
     * @param array $data
     * @param int $idUser
     */
    public function updateUser($data, $idUser)
    {
       $data = $this->_getArrayColumTable(self::USER_USER, $data);
       $this->_db->update(self::USER_USER, $data, $this->_db->quoteInto('id=?', $idUser));
       return;
    }
    
    public function getGroupSystem()
    {
        $select = $this->_getSelect();
        $select->from(self::USER_GROUP, array('id', 'name'));
        return $this->_db->fetchPairs($select);
    }
    
    
    /**
     * Запишем данные в таблицу напоминания паспорта
     * @param array $data
     */
    public function insertUserChadePassword ($data)
    {
        // запишем данные
        $this->_db->insert(
        self::USER_CHADE_PASSWORD, $data);
    }
    /**
     * Вернет данные с таблицы смены паспорта
     * @param $key
     * @return Zend_Db_Select
     */
    public function getDataUserChadePassword ($key)
    {
        $select = $this->_db->select();
        $select->from(self::USER_CHADE_PASSWORD);
        $select->where('`key` = ?', $key);
        return $select;
    }
    /**
     * Удаления данный с таблицы смены паспорта по id пользователя.
     * @param int $idUser
     */
    public function delDataUserChadePssword ($idUser)
    {
        $this->_db->delete(self::USER_CHADE_PASSWORD, 'id_user=' . $idUser);
        return;
    }
    /**
     * Онобновляем паспорт пользователя
     * @param string $newPassword
     * @param int $idUser
     */
    public function updatePassword ($newPassword, $idUser)
    {
        $this->_db->update(self::USER_USER, array('password' => $newPassword), 'id=' . $idUser);
        return;
    }
    
    /**
     * Удаления пользователя по его id
     * @param int $idUser
     */
    public function deleteUser($idUser)
    {
     $this->_db->delete(self::USER_USER, 'id=' . $idUser);
    }
    
    /**
     * Удаления устаревших записей с таблици смены паспорта.
     */
    public function delStaleDataChadePassword ()
    {
        $this->_db->delete(self::USER_CHADE_PASSWORD, 'date_del < ' . time());
        return;
    }
    /**
     * Удалить устаревшие данные регистрации.
     */
    public function delStaleData ()
    {
        $this->_db->delete(self::USER_TEMP_REGISTER, $this->_db->quoteInto('date_del < ?', time(), 'INTEGER'));
        return;
    }
}